<?php

namespace common\models\base;

use Yii;
use yii\behaviors\TimestampBehavior;
use yii\behaviors\BlameableBehavior;
use mootensai\behaviors\UUIDBehavior;

/**
 * This is the base model class for table "invitation_code".
 *
 * @property string $id
 * @property string $generate_id
 * @property string $invitation_code
 * @property string $created_at
 * @property string $updated_at
 * @property string $deleted_at
 * @property string $created_by
 * @property string $updated_by
 * @property string $deleted_by
 * @property integer $status
 *
 * @property \common\models\GenerateRecords $generate
 */
class InvitationCode extends \common\hayz\db\ActiveRecord
{
    use \mootensai\relation\RelationTrait;

    private $_rt_softdelete;
    private $_rt_softrestore;


    const ID_LENGTH = 3;
    const ID_MAX = 101;

    public function __construct(){
        parent::__construct();
        $this->_rt_softdelete = [
            'deleted_by' => \Yii::$app->user->id,
            'deleted_at' => date('Y-m-d H:i:s'),
        ];
        $this->_rt_softrestore = [
            'deleted_by' => 0,
            'deleted_at' => date('Y-m-d H:i:s'),
        ];
    }

    /**
    * This function helps \mootensai\relation\RelationTrait runs faster
    * @return array relation names of this model
    */
    public function relationNames()
    {
        return [
            'generate'
        ];
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [[ 'generate_id', 'invitation_code'], 'required'],
            [['id','created_at', 'updated_at', 'deleted_at','status'], 'safe'],
            [[ 'generate_id', 'created_by', 'updated_by', 'deleted_by'], 'string', 'max' => 32],
            [['invitation_code'], 'string', 'max' => 45],
            [['invitation_code'], 'unique'],
        ];
    }

    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'invitation_code';
    }



    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'generate_id' => '生成记录ID',
            'invitation_code' => '邀请码内容',
            'status' => 'Status',
        ];
    }
    
    /**
     * @return \yii\db\ActiveQuery
     */
    public function getGenerate()
    {
        return $this->hasOne(\common\models\GenerateRecords::className(), ['id' => 'generate_id']);
    }

    /**
     * 获取最大的ID
     * 在数据库中查找最大的ID，如果为空，则返回常量ID_MAX
     * @return int
     */
    public static function getMaxId()
    {
        $id = self::find()->max('id');
        if (!$id){
            $id = self::ID_MAX;
        }
        return $id;
    }


    /**
     * 生成随机数
     * @param int $length 邀请码长度
     * @return int 返回随机的数字
     */
    public static function rand($length)
    {
        $rand_num = '';
        //获取随机数长度
        $len = self::getRandLen($length);
        //循环拼接随机数
        for ($i = 0; $i < $len; $i++){
            $rand_num .= rand(0,9);
        }
        return $rand_num;
    }


    /**
     * 获取随机数的长度
     * @return int
     */
    protected static function getRandLen($length)
    {
        $len = $length - self::ID_LENGTH;
        return $len;
    }


    /**
     * 生成单条记录
     * @param $generate_id 生成邀请码记录ID
     * @param int $id 起始ID
     * @param int $length 邀请码位数
     * @return InvitationCode 返回当前实例
     */
    public static function createOne($generate_id,$id=0,$length=6)
    {
        //实例化邀请码的model
        $model = new static();
        //如果$id为空，属性ID等于最大ID+1，否则等于$id+1
        $model->id = $id ? $id+1:self::getMaxId() + 1;
        //属性generate_id赋值为$generate_id
        $model->generate_id = $generate_id;
        //属性invitation_code赋值为$id加rand方法生成的随机数
        $model->invitation_code = $model->id . self::rand($length);
        //属性status赋值为0
        $model->status = 0;
        //如果保存成功$code_id赋值为属性ID
        $model->save();
        return $model;
    }


    /**
     * 批量生成记录
     * @param $generate_id 生成邀请码记录的ID
     * @param $quantity 生成数量
     * @param $length 邀请码位数
     * @return int 返回成功的数量
     */
    public static function createAll($generate_id,$quantity,$length=6)
    {
        $num = 0;
        $id = 0;
        //循环$quantity次数添加单条记录
        for ($i = 0 ; $i < $quantity ; $i++){
            $model = self::createOne($generate_id,$id,$length);
            //如果成功$num+1,$id赋值为属性ID
            if ($model&&!$model->hasErrors()){
                $id = $model->id;
                $num++;
            }
        }

        return $num;
    }


    /**
     * 验证邀请码是否正确
     * @param $code 从前端传过来的邀请码
     * @return bool 返回true或者false,代表验证成功或者失败
     */
    public static function verificationCode($code)
    {
        //使用参数$code来查询数据库，来确定验证码是否存在
        $model = self::findOne(['invitation_code'=>$code]);
        if (!$model){
            return false;
        }
        //验证验证码是否使用过,0代表未使用
        if ($model->status !== 0){
            return false;
        }
        //验证成功返回true，失败返回false
        return $model ;
    }
}
